Quando non devi, non farlo! Diventerà molto doloroso, specialmente se le lingue superano i confini come suggerito tu (leggi l'architettura pulita sui confini).
Se vuoi davvero farlo, ci sono i cosiddetti livelli di interoperabilità in ogni software (NDK per Java per esempio). Ma devi sempre preoccuparti della rappresentazione di variabili e concetti nella memoria e nella piattaforma sottostante.
Il peggio qui: hai tre tipi di linguaggi di programmazione completamente diversi: C è compilato e molto (molto) vicino all'hardware, Java è un mix tra compilato e interpretato ed è un po 'più lontano dalla piattaforma ( sta filtrando qua e là) e finalmente hai un linguaggio interpretato con python che nasconde l'hardware.
Il tuo argomento per farlo sembra per me un'ottimizzazione prematura: dovresti solo migliorare le prestazioni quando misuri un problema con le prestazioni nella tua attuale applicazione. Secondo me, Java è molto veloce attraverso il JIT (vedi Kafka per esempio - è incredibile)
Nota: quando vuoi veramente usare linguaggi diversi, assicurati che siano tutti sulla JVM come Java con Groovy e Jython per esempio.
[EDIT]: è stato menzionato nei commenti: ci sono casi d'uso in cui lingue diverse hanno un senso. L'esempio migliore è un'applicazione web, in cui sono presenti HTML, codice Java e codice SQL in un progetto (anche con tre diversi paradigmi: solo markup, imperativo, dichiarativo). Ma hai MOLTO confini chiari (HTML ha un'estensione di file diversa).
Anche in questo scenario chiaro, è difficile non mescolare le lingue con i confini trasversali. Ad esempio, dovresti spingere tutto il codice SQL awai dalla tua logica aziendale e mantenere separato l'HTML. In breve: cerca di evitarlo, ma quando devi farlo, sii consapevole dei tuoi limiti.