Draw everything at, at least double the required resolution - then when you scale down to the required resolution, you get a neat anti-alias effect, so smooth edges on everything and no jaggies.
I second the custom particle system idea as well - a good particle system can really make your game shine. It doesn't even have to be complex... a function to update your particles position, alpha, scale - and start each particle effect with a function that sets the properties and texture. Ideally you'd be able to spawn a particle with a function call, which in turn makes it easy to add new particles, and encourages you to do that. I've even made creatures with particle systems, like a moth that flies around light sources and chases the player, and a 2D fish. It's actually pretty good fun to make particle effects once the framework is in place.
One other thing is shaders, pretty obvious I know - but choose the right shader for the job... the best looking shaders tend to be the slowest - try and find a good balance between performance and looks - because looks are no good if it results in a sluggish game.

Health, Ammo, and bacon and eggs!
