I haven’t seen that Graal generally requires changes, though I haven’t looked at it too much. Scala Native doesn’t unless you are using a lot of Java libraries. Even there, the native implementations of the Java libraries have been advancing significantly of late.
I have seen that the native images are slower than the JIT for long-running processes, but that’s because the JIT can optimize based on runtime information in ways that no normal compiler can. Still doesn’t make up for the lack of memory layout control given the importance of caching on modern processors, but that’s only significant compared to Rust.
I’m wondering why you consider Java, Scala, and Kotlin to be “JIT-optimized languages”. What features of the languages themselves do you think tie them to the JIT?