Eu acho que realmente depende da linguagem e da função. Embora os compiladores c e c ++ possam incorporar muitas funções, esse não é o caso para Python ou Java.
Embora eu não conheça os detalhes específicos do java (exceto que todo método é virtual, mas sugiro que você verifique melhor a documentação), no Python tenho certeza de que não há inlining, nenhuma otimização da recursão da cauda e chamadas de função são muito caras.
As funções Python são basicamente objetos executáveis (e, na verdade, você também pode definir o método call () para transformar uma instância de objeto em uma função). Isso significa que há muita sobrecarga em chamá-los ...
MAS
quando você define variáveis dentro de funções, o intérprete usa o LOADFAST em vez da instrução LOAD normal no bytecode, tornando seu código mais rápido ...
Outra coisa é que, quando você define um objeto que pode ser chamado, padrões como memorização são possíveis e podem efetivamente acelerar muito o seu cálculo (com o custo de usar mais memória). Basicamente, é sempre uma troca. O custo das chamadas de função também depende dos parâmetros, porque eles determinam a quantidade de coisas que você realmente precisa copiar na pilha (portanto, em c / c ++, é prática comum passar grandes parâmetros como estruturas por ponteiros / referência em vez de por valor).
Eu acho que sua pergunta é, na prática, muito ampla para ser respondida completamente no stackexchange.
O que eu sugiro que você faça é começar com um idioma e estudar a documentação avançada para entender como as chamadas de função são implementadas por esse idioma específico.
Você ficará surpreso com quantas coisas aprenderá neste processo.
Se você tiver um problema específico, faça medições / criação de perfil e decida o clima, é melhor criar uma função ou copiar / colar o código equivalente.
se você fizer uma pergunta mais específica, seria mais fácil obter uma resposta mais específica, eu acho.