1) It's probably the cpu that's sitting there waiting for the gpu, not the cpu actually working hard.
It seems to me that you are busting your graphics card's fill rate (try at 640x480, see if performance increases)
It looks like background is sizeof(screen) which means you are sort of doing triple buffering. This allows for neat effects, but graphics cards really do not like rendering big textures like that.
Instead, since you are just blending the same content repeatedly, have your 'background' be sizeof(light_circle), draw at 0,0 then draw 'background' where you need it to the back buffer, and draw empty rectangles with color (0,0,0,darkness) to fill the gaps.
Actually I don't think you need to clear and redraw the 'background' target every time, nothing is changing on it from frame to frame. Only need to redraw it when darkness changes.
That might not work, I'm still not 100% sure the effect you're going for. Ty also to see if shaders could help. But the main thing is you need to avoid rendering a bitmap sizeof(screen) that's very expensive; especially where non power of 2 textures are not well supported.