I
1. У JIT жёсткое ограничение по времени компиляции. Из-за этого часть оптимизаций неприменима (гуглите например struct-reorg gcc, в межпроцедурной версии она долгая).
2. В режиме по умолчанию JIT имеет информацию о профиле и целевой архитектуре. Но AOT её тоже может иметь, если программист заморочится, соберёт профиль и даст опцию о целевой архитектуре.
Таким образом, если искать в принципе максимальной производительности, то имхо нужно использовать AOT с перечисленными мной наворотами, а если хочется приличной производительности при минимуме усилий, то лучше JIT.