я разрешил эту проблему. Все дело было в настройки spring.jpa.open-in-view, которая по умолчанию в true и которая УДЕРЖИВАЕТ соединение после первого запроса в точке А. Выставление ее в false приводит к тому, что все летает.
Подробнее здесь -
https://www.baeldung.com/spring-open-session-in-vi...
В целом, данная настройка кардинально противоречит духу виртуальных потоков (да и приложению без виртуальных потоков дольше) и фактически привязывает количество одновременно обрабатываемых запросов к количеству соединений в пуле.
Представим, что у меня в пуле 50 соединений, и каждый запрос пользователя подразумевает вставку в базу за 1 мс и затем обращение к другому сайту по http, длящееся одну секунду. Тогда, по идее, за 1 секунду я должен уметь обслуживать 1000 пользователей (если вставки в таблицу лочат ее). Да, каждый пользователь будет ждать итоговый ответ 1 секунду из-за другого сайта, но получат его одновременно.
Однако с таким вот подходом spring jpa все иначе, я за секунду обслужу ровно 50 человек, столько, сколько соединений в пуле, потому что соединения останутся висеть у сессий jpa, пока я не закончу с http обращениями. Даром что транзакцию я закоммитил и вроде как даже закрыл соединение сразу после вставки.