Плюсы натива - не нужно тащить в рантайм какой-то интерпретатор или jit-компилятор, по тому часто само приложение получается компактнее, жрёт меньше ОЗУ, и быстрее запускается.
А также AOT-компилятор может делать больше сложных оптимизаций, тк у него нет ограничений в ресурсах и времени.
Нативное приложение обычно сложно декомпилировать
Плюсы вм - для портирования приложений нужно портировать только вм.
Если вм уже установлена на целевую машину, то байткод будет занимать меньше места, чем нативный код.
В теории может быть быстрее чем нативное приложение, тк у JITа имеется больше информации, чем у AOT-компилятора даже с профилем.
Компиляция в байткод идёт быстрее, чем в нативный, тк не нужно делать много сложных оптимизаций - этим будет заниматься JIT в фоне. И компилировать он будет только то что используется, а что не используется или используется редко - нет (будет без сложных оптимизаций)
Проблемы со скоростью холодного старта решаемы.