PERF: DataFrame.astype where dtype is an ExtensionDtype
- [x] [Tests added and passed](https://pandas.pydata.org/pandas-docs/dev/development/contributing_codebase.html#writing-tests) if fixing a bug or adding a new feature
- [x] All [code checks passed](https://pandas.pydata.org/pandas-docs/dev/development/contributing_codebase.html#pre-commit).
- [x] Added [type annotations](https://pandas.pydata.org/pandas-docs/dev/development/contributing_codebase.html#type-hints) to new arguments/methods/functions.
- [x] Added an entry in the latest `doc/source/whatsnew/v2.1.0.rst` file if fixing a bug or adding a new feature.

```
       before           after         ratio
     [c6353c49]       [e84e1676]
     <main>           <perf-astype-ea-dtype>
-      37.0±0.9ms         24.4±2ms     0.66  frame_methods.AsType.time_astype(('float64', 'float64[pyarrow]'), False)
-        36.0±2ms         23.0±2ms     0.64  frame_methods.AsType.time_astype(('float64', 'Float64'), False)
-      37.9±0.4ms         23.7±2ms     0.63  frame_methods.AsType.time_astype(('int64[pyarrow]', 'float64[pyarrow]'), False)
-        32.4±1ms         19.3±2ms     0.59  frame_methods.AsType.time_astype(('int64[pyarrow]', 'float64[pyarrow]'), True)
-        33.0±1ms         19.2±2ms     0.58  frame_methods.AsType.time_astype(('float64', 'Float64'), True)
-      32.0±0.5ms       17.8±0.9ms     0.56  frame_methods.AsType.time_astype(('Int64', 'Float64'), False)
-        30.0±1ms         16.5±2ms     0.55  frame_methods.AsType.time_astype(('Int64', 'Float64'), True)
-        32.7±2ms         17.8±2ms     0.54  frame_methods.AsType.time_astype(('float64', 'float64[pyarrow]'), True)
-        24.4±2ms       1.31±0.3ms     0.05  frame_methods.AsType.time_astype(('Float64', 'Float64'), True)
-        24.2±2ms         973±50μs     0.04  frame_methods.AsType.time_astype(('float64[pyarrow]', 'float64[pyarrow]'), True)
-        21.0±1ms        500±100μs     0.02  frame_methods.AsType.time_astype(('Float64', 'Float64'), False)
-        20.9±2ms          378±5μs     0.02  frame_methods.AsType.time_astype(('float64[pyarrow]', 'float64[pyarrow]'), False)
```

thx @lukemanley 