Na verdade, o java ainda está muito atrás no que diz respeito a games. Não estou falando aqui de jogos pequenos, como os vistos em flash, em applet ou em celulares, mas o mercado de jogos 3D de prateleira ou dos grandes MMORPGs.
A parte 3D é realmente muito mais lenta do que o DirectX e o OpenGL, que também estão em constante evolução. Além disso, nenhum video-game suporta hoje o padrão java 3d, e nem pretende suportar. O grande apelo dos video-games é o fato de cada um ter seu hardware exclusivo, com funções diferentes e pontos fortes (e fracos diferentes). Homogeneizar tudo numa VM não é interesse dessa indústria, e nem ter jogos em múltiplas plataformas. Aliás, longe disso.
O java também tem o grande inconveniente se ter um acesso difícil ao hardware, sendo você obrigado a recorrer a JNI. O que dificulta, mesmo em jogos para PC, no suporte ao último joystick, por exemplo.
Finalmente, uma aplicação java é muito menos otimizável do que uma C/C++. Vale lembrar que jogos são o tipo de sistema em que o investimento em otimização é enorme. Embora o Java tenha apresentado performance cada vez melhor, vale lembrar que os benchmarks geralmente são realizados levando-se em consideração o desenvolvimento de sistemas normais, e não de sistemas super otimizados.
Quanto ao uso de java fora da web. Aqui onde eu trabalho os sistemas são desktop. Com o java programamos um executor de testes, que roda scripts groovy sequencialmente e em paralelo, que comunicam-se (através de bibliotecas java) com um servidor (feito em C) que controla um hardware para testar centrais telefônicas. Outro software que também produzimos comunica-se diretamente com o software de testes das centrais (via Serial, SSH, GBIB, ou um protocolo de rede específido, dependendo do hardware sob teste) para verificar se a produção dela está correta.