I got lucky and managed to get in touch with someone who just by chance happened to have an old Nvidia Geforce 7600GS lying around so I've had my chance to try to get it working there, and it's at least going forward. I've also had it tested on a super old so far unnamed Radeon GPU but it's more fond of crashing and showing funny magenta pixels than actually running the engine at the moment. Still no Sandy Bridge GPU to test on but I suspect it won't be a problem since they support OGL 3 after all.
What I've been neglecting a bit is Macs. davedes was kind enough to offer to test it on his Mac, but it turns out he has an outdated version which won't let him run Java 7 which the game uses. If you have a Mac computer with a not-brand-new graphics card (8000-9000 series or 200 series), it'd be really nice if you could test the engine out. PM me for a download link.
Rant about old hardware:
So we fire up the engine on the 7600GS and get an instant VM crash on startup in glGenerateFramebuffers(). It was obvious the driver was just spitting us in the face, so after a driver update it actually started! The UI renders, everything else is black! Turn off all special effects... Okay, it's still black but at least I can see the rim lighting on objects, which means something in my super merge shader is going wrong...
gl_FragColor = vec4((ambientColor*ssao + glow) * diffuseColor + rimLight, fog * outlineStrength);
Fog and outlineStrength are fine since it's not completely black. rimLight is also working and glow is off, meaning that either ambientColor, ssao or diffuseColor is always 0. ambientColor definitely isn't 0 since it's a uniform variable and diffuseColor is just a simple texture read using GL11 functionality, leaving us with our main suspect: ssao.
Since SSAO (it's a lighting effect that darkens the ambient light in narrow places like under a car) is disabled I'm using a white dummy 4x4 for the SSAO reading instead. Basically, I allocated the texture and glClear()ed it each frame to ensure it was white. Apparently glClear() wasn't working, probably since I wasn't actually rendering anything to it. Simply setting it to white permanently using glTexImage2D() worked though.
So I basically dissected the whole engine just to realize that clearing a texture to a color doesn't actually set it to that color on old hardware. It probably just marks it invalid or something and does the clear later when you start rendering to it. Don't you just love old hardware?