BUG (string dtype): let fillna with invalid value upcast to object dtype
Like I did for `replace()` (issue https://github.com/pandas-dev/pandas/issues/60282 / PR https://github.com/pandas-dev/pandas/pull/60285), it turns out that also for `fillna()` we generally upcast to object dtype if the fill value does not fit the dtype:

```python
>>> ser = pd.Series([1, 2, None], dtype="float")
>>> ser.fillna("a")
Out[4]: 
0    1.0
1    2.0
2      a
dtype: object
```

And similarly as for `replace()`, this was raising an error in the case of `StringDtype`.  
The reason is that for generic (external) ExtensionArrays, we are actually strict and `fillna` is just dispatched to the EA without fallback to object dtype; while for all our own _default_ extension dtypes we do have custom code to ensure to do a fallback (but _not_ for the masked dtypes and ArrowDtype ..).

Given this is the default behaviour right now for other dtypes (and so we also haven't deprecated this for current usage of strings in object dtype), I would preserve this fallback for now to avoid this as another breaking change in 3.0.

xref https://github.com/pandas-dev/pandas/issues/54792

Thanks @jorisvandenbossche  Owee, I'm MrMeeseeks, Look at me.

There seem to be a conflict, please backport manually. Here are approximate instructions:

1. Checkout backport branch and update it.

```
git checkout 2.3.x
git pull
```

2. Cherry pick the first parent branch of the this PR on top of the older branch:
```
git cherry-pick -x -m1 34c39e9078ea8af12871a92bdcea2058553c9869
```

3. You will likely have some merge/cherry-pick conflict here, fix them and commit:

```
git commit -am 'Backport PR #60296: BUG (string dtype): let fillna with invalid value upcast to object dtype'
```

4. Push to a named branch:

```
git push YOURFORK 2.3.x:auto-backport-of-pr-60296-on-2.3.x
```

5. Create a PR against branch 2.3.x, I would have named this PR:

> "Backport PR #60296 on branch 2.3.x (BUG (string dtype): let fillna with invalid value upcast to object dtype)"

And apply the correct labels and milestones.

Congratulations — you did some good work! Hopefully your backport PR will be tested by the continuous integration and merged soon!

Remember to remove the `Still Needs Manual Backport` label once the PR gets merged.

If these instructions are inaccurate, feel free to [suggest an improvement](https://github.com/MeeseeksBox/MeeseeksDev).
                 Manual backport -> https://github.com/pandas-dev/pandas/pull/60316
