In my experience, native image is noticeably slower than regular openjdk, at least for Scala. The start up speed is nice, though.
You need to pay Oracle $lots for a GraalVM enterprise licence to get profile guided optimisations, if you want some of your peak performance back.
Twitter thinks otherwise, as they are the major consumer of GraalVM in production.
GraalVM is a JIT compiler for the most part. That's the one Twitter uses I believe. SubstrateVM is what lets you perform a closed world assumption ahead of time build. And that does indeed run left performant most of the time, but it uses less memory and starts faster.
Unless one feeds it with PGO data, just like it happens in most AOT workflows for optimizations like devirtualization.
What part of production, do you know? Because mobile.twitter.com links are slow as hell to load