Em termos de contextos especificamente, há pouca diferença. A maioria das implementações do OpenGL possui a maioria dos recursos do OpenGL 3.0+, mesmo ao usar um contexto legado, devido à maneira como as extensões do OpenGL funcionam.
Se você está perguntando especificamente sobre quais recursos do OpenGL 3.0 valem a pena usar, alguns dos melhores são shaders e instanciamento de geometria, os quais são úteis mesmo para gráficos 2D em determinadas circunstâncias. No entanto, na maioria dos casos, para 2D simples, tudo o que você fará é preencher um buffer de vértice de fluxo contínuo a cada quadro e fazer uma única chamada de empate, para que você realmente faça muito pouco.
Em termos de 2D no OpenGL em geral, verifique se você possui um atlas de textura (folha de sprite), para que raramente precise alterar os estados da textura. Você deseja evitar fazer uma chamada de desenho por sprite, pois isso é incrivelmente ineficiente, e prefere agrupar vários sprites e desenhá-los todos de uma vez. Renderize com o algoritmo do pintor, onde "render" significa empurrar a geometria para um buffer de vértice e desenhá-la no final. Pós-processo como achar melhor.