PERF: avoid copy in replace
Closes #34136.

Hopefully this preserves the right behavior. I could imagine breaking something if a caller was relying on `putmask(., inplace=False)` returning a copy.

```
import pandas as pd
import numpy as np

df = pd.DataFrame({"A": 0, "B": 0}, index=range(4 * 10 ** 7))

# the 1 can be held in self._df.blocks[0], while the inf and -inf cant
%timeit df.replace([np.inf, -np.inf, 1], np.nan, inplace=False)



# 1.0.3
483 ms ± 10.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

# master
900 ms ± 18.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

# PR
490 ms ± 8.64 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
```