Ambas são linguagens orientadas a objetos para a JVM que possuem lambdas e fechamentos e interoperam com Java. Fora isso, eles são extremamente diferentes.
O Groovy é uma linguagem "dinâmica", não apenas no sentido de que é digitada dinamicamente, mas também em suporte a metaprogramação dinâmica.
Scala é uma linguagem "estática", pois é digitada estaticamente e praticamente não possui metaprogramação dinâmica além das coisas desajeitadas que você pode fazer em Java. Observe que o sistema de tipo estático do Scala é substancialmente mais uniforme e sofisticado que o do Java.
O Groovy é influenciado sintaticamente por Java, mas semanticamente influenciado mais por linguagens como Ruby.
Scala é sintaticamente influenciado por Ruby e Java. É semanticamente influenciado mais por Java, SML, Haskell e uma linguagem OO muito obscura chamada gBeta.
O Groovy possui despacho múltiplo "acidental" devido à maneira como lida com a sobrecarga de Java.
O Scala é apenas de despacho único, mas possui correspondência de padrões inspirada em SML para lidar com alguns dos mesmos tipos de problemas que o despacho múltiplo deve tratar. No entanto, onde o despacho múltiplo só pode despachar no tipo de tempo de execução, a correspondência de padrões do Scala pode despachar nos tipos, valores ou ambos de tempo de execução. A correspondência de padrões também inclui ligação variável sintaticamente agradável. É difícil enfatizar quão agradável esse recurso único torna a programação no Scala.
O Scala e o Groovy suportam uma forma de herança múltipla com mixins (embora Scala os chame de características).
O Scala suporta aplicativos de funções parciais e curry no nível da linguagem, o Groovy possui um método "curry" estranho para executar aplicativos de funções parciais.
Scala faz otimização direta da recursão da cauda. Não acredito que o Groovy acredite. Isso é importante na programação funcional, mas menos importante na programação imperativa.
Scala e Groovy são avidamente avaliados por padrão. No entanto, o Scala suporta parâmetros de chamada por nome. O Groovy não - chamada por nome deve ser emulada com fechamentos.
O Scala tem "para compreensões", uma generalização das compreensões de lista encontradas em outros idiomas (tecnicamente são compreensões de mônada mais um pouco - em algum lugar entre o fazer de Haskell e o LINQ do C #).
O Scala não tem conceito de campos "estáticos", classes internas, métodos etc. - ele usa objetos singleton. Groovy usa o conceito estático.
A Scala não construiu na seleção de operadores aritméticos da mesma maneira que o Groovy. No Scala, você pode nomear métodos de maneira muito flexível.
Groovy tem o operador elvis para lidar com null. Os programadores do Scala preferem usar os tipos Option ao usar null, mas é fácil escrever um operador elvis no Scala, se você quiser.
Finalmente, existem mentiras, existem malditas mentiras e, depois, há referências. O jogo de benchmarks de linguagem de computador classifica o Scala como sendo substancialmente mais rápido que o Groovy (variando de duas a 93 vezes mais rápido), mantendo aproximadamente o mesmo tamanho de fonte. benchmarks .
Tenho certeza de que existem muitas, muitas diferenças que não cobri. Mas espero que isso lhe dê uma essência.
Existe uma competição entre eles? Sim, é claro, mas não tanto quanto você imagina. A verdadeira concorrência de Groovy é JRuby e Jython.
Quem vai ganhar? Minha bola de cristal está tão quebrada quanto a de qualquer outra pessoa.