BUG: fillna with DataFrame input should preserve dtype when possible
When filling a DataFrame with another DataFrame using `fillna`, columns with matching dtypes were being unnecessarily cast to `object` due to use of `np.where`.

This PR updates the logic to use pandas’ `Series.where`, which is dtype-safe and respects extension and datetime types.

- [x] Closes #61568
- [x] Adds a regression test
- [x] Adds a whatsnew entry
- [x] pre-commit checks passed
Since we now operate column-wise and use `Series.where `instead of `np.where`, so it keeps dtype safety as suggested by @jbrockmendel

This also preserves extension dtypes like `string[pyarrow]`, which used to get cast to object. Because of that, `test_fillna_dataframe_preserves_dtypes_mixed_columns` is failing since it expects the downgraded dtype.

Let me know if this behavior change is fine, happy to update the test or tweak the logic based on what’s preferred! This pull request is stale because it has been open for thirty days with no activity. Please [update](https://pandas.pydata.org/pandas-docs/stable/development/contributing.html#updating-your-pull-request) and respond to this comment if you're still interested in working on this.