Olá Wesley! É mais ou menos isso que você entendeu mesmo. Vou falar um pouco do caso específico do Java, que tenho mais familiaridade. Sem entrar em muitos detalhes da JVM (Máquina Virtual Java), apenas precisamos saber que ela possui um compilador Just In Time. Quando rodamos um programa na JVM, ela começa a interpretar o código para executá-lo. Enquanto o código é interpretado, o compilador JIT começa a procurar otimizações que podem ser feitas em tempo de execução. Caso uma função seja chamada uma única vez, não vale a pena compilar aquele trecho, porém se uma mesma função começa a ser executada diversas vezes, o JIT compila essa função. Dessa forma, temos o melhor dos dois mundos. Para trechos de código que são raramente executados ou executados uma única vez usamos o interpretador, já que seria gasto mais tempo para compilar do que simplesmente interpretar. Para os trechos que são executados diversas vezes, o JIT compila em tempo de execução, para que as próximas vezes que o código for executado seja diretamente em código de máquina, muito mais rápido.
Esse vídeo explica mais detalhadamente o JIT: https://www.youtube.com/watch?v=rrhO_P0IM3s
Se ainda não ficou claro algum ponto pode perguntar!