Isso já está offtopic, mas aí vai:
Imagine que você dereferencie um ponteiro nulo. Em java o resultado é “java.lang.NullPointerException” e em C o resultado é “Este programa executou uma operação ilegal e será fechado”.
Imagine que você ultrapasse o limite de um array. Em java o resultado é “java.lang.ArrayIndexOutOfBoundsException” e em C o resultado é corrupção de memória ou obtenção de lixo que ocasionam problemas que podem ser dificílimos de debugar.
Sem falar na sintaxe horrorosa do C (que o java herdou parte dela, mas felizmente no java ficou algo muito mais limpo).
Java é rápido (há dez anos atrás (Java 1.0 e 1.1) era uma carroça puxada por tartarugas, mas hoje 6.0 é muito rápido).
Acontece que C ainda é mais rápido, pois ele nunca verifica se o ponteiro é nulo ou se ele corresponde a um endereço inválido, característica que não há como evitar no java.
Quanto ao malloc vs. new, isso ocorre porque a JVM já pré-aloca a memória para ela e a recicla quando necessário. É possível (porém muito-muito-muito trabalhoso) fazer isso em C. Mas se for feito em C corretamente, o resultado é bem superior ao java.
Na minha opinião, MatLab sim é lento.