here's what we're doing. We use Python 2.7 and Pygame 1.7 (I think, not 100% sure, but whatever is on the build machine since ~2yrs ago).
We set up a a software surface using pygame, but do not use pygame for rendering, just for input. Instead we both blit and draw onto the pygame surface using cairo. This involves some ctypes magic to set up - email me and I'll send you the code if you want. To get the performance, we use a "dirty rect" type algorithm. This doesn't really help with full screen redraws (i.e. scrolling) but we don't do a lot of those anyway.
My "head in this direction" advice is: use SDL2 (via pySDL) and do your blitting on an OpenGL context. I don't think you need to make any OpenGL calls for that, just use the SDL2 primitives (Sprite etc). Don't be put off by the work-in-progress feel of SDL2/pySDL - e.g. you may need to get the latest version from their repos and compile everything yourself.
This combination is what we'll be using ourselves, for our next project.
Cheers!
![Smile :)](./images/smilies/icon_e_smile.gif)