I’d say anything less than 15 Begin-End pairs is very good if you have a lot of fx and states and deferred is what I usually prefer unless I need a sort - it’s all pretty optimized actually - and Draw count isn’t something you need to worry about – most of the actual draw work and state stuff happens in the End() call [unless that has changed]. If you end up using dozens of fx, you can also use draw with a color to signal to your combined-shader which shading function to use and discard the vertex color if not needed but I’d make sure to test shaders in “baby-steps” as you combine them. I do a lot of unnecessary optimization so I feel comfortable that I’m free to add colossal stuff and more fx later (but I try to do so in a way that will reduce complexity or confusion rather than increase it if possible). ;p
As Jjagg mentioned - source-rects from sprite-sheets and batch that kind of drawing together unless layers or fx don’t allow it to be possible in some situations. Watch out for cases where you accidentally render your scene-tiles multiple times (or entire world) - only process the span that’s close to visibility ie: (player_closest_tile_X-20 to player_closest_tile_X+20) as nested loop in same sort of thing for Y span… for stuff that’s a bit off-screen it shouldn’t hurt.