I see. Looking at the source, you could probably try doing:
Code:int f = frameCount;
frameCount = 0;
size(width,height,newrenderer);
frameCount = f;
However, that's not much better than what you're doing. The size() only being allowed in setup() is merely by design, so clearly you're not intended to change the renderer after the fact. If you do this frequently, it might be a waste of processing (making a new image buffer each time), as well.
Looking at the source, you can create new PGraphics3 and PGraphics2 with a null PApplet (if you want to bypass using PApplet altogether), just not for PGraphicsGL.
Then you can either change PApplet.g to each one (without having to create a new PGraphics object every switch), or avoid PApplet altogether and call begin/endFrame() manually and use the PGraphics.image object.
Still, all this stuff might change, since it's dealing with Processing internals, so I guess fry or someone would have to answer whether this stuff will be finalized at some point.
Marcello
p.s. this post makes no sense, but I think that's all I have to add. -__-