Да, всё кэшируется, и ты можешь увидеть это в исходниках.
Решение такое, чтобы разработчику было удобнее.
Некоторые штуки можно на source generators запилить.
Некоторые другие - обойтись без рефлексии вообще (например использовать MapGet/MapPost вместо контроллеров)
На самом деле, проблемы от рефлексии могут возникнуть только в двух случаях:
1. Когда у тебя какая-то экстремальная нагрузка и нет кэширования (или это холодный запуск, и ничего в кэше нет)
2. Когда ты используешь Assembly Trimming
PS: А почему "слишком много" по твоему мнению? Что конкретно, что реализовано на рефлексии, можно реализовать без неё?