The SetDisplayMode command will flush your object, sprite and video memory data. Perhaps this is what is slowing things down; otherwise I'm not sure what is going on; you should time each function call to see where the major bottle neck is.
If the issue persists, have a play around with Render Targets. Basically Render Targets allow you to draw a camera result to an image, which can be resized, or clipped off the window, with the constraint of perhaps, the screen size. Hopefully, resizing the render target is lighter work for the engine, than changing the display mode.
I've not written a tutorial on render targets but the here is an explanation.
You create a camera, and use [set camera to image], of the size of your window. What you do with the image is up to you, EG: sprite it, paste it or bitmap copy it.
The negative equivilent of your camera Id will give you the Id for the bitmap it is rendering to. So camera 1, uses bitmap -1, camera two uses bitmap -2, camera 0 is obviously 0. Set bitmap format can also help you control what pixel data the cameras will draw.
Consider using Sync Mask to only render the extra camera when something has changed, do not Sync the display if nothing visible has changed.
EDIT
Set Camera View, is another solution; but I think it will not change the proportions