Resource exhaustion exploit when parsing queries
### Issue Description

We've identified a potential resource exhaustion vector which has a significant impact on our CPU and response times. We're currently experiencing this on AS 3 however we're able to reproduce on AS 4.

We have a [custom query complexity calc plugin](https://github.com/tadhglewis/apollo-koa-minimal/blob/main/index.mjs#L33) which is intended to handle this scenario and others however it seems before we get to `didResolveOperation` event/stage, there is some processing that takes a long time.

I'm assuming this is an underlying dependancy in Apollo however I'm not 100% sure so any ideas or suggestions on how we can mitigate this would be great.

### Link to Reproduction

https://github.com/tadhglewis/apollo-koa-minimal

### Reproduction Steps

1. `pnpm install && pnpm start`
2. Run
```zsh
curl \
--data "{\"query\":\"{ $(python3 -c "print('%s' % ('__typename ' * 1000))")}\"}" \
--header 'Content-Type: application/json' \
--include \
--request POST \
https://example.com/graphql
```
This will take ~2.5s and increase to ~21s if you change the number of `__typename` to `3000`

<img width="839" alt="Screenshot 2023-08-16 at 10 33 30 pm" src="https://github.com/apollographql/apollo-server/assets/53756558/3227af55-1a90-4374-bac0-4daf6e28bc55">


Notes
- On subsequent requests there seems to be some caching and response time goes to ~10ms however if you change the number of `__typename` by one it will bypass this 
- This isn't limited to `__typename`, it can also be hit when using `hello` and I imagine introspection as well