my god that’s too many questions!
First of all - branching looping etc. are okay today. For reference: In CryEngine they would compile a new shader for each permutation (when creating materials), leading to hundreds of different shaders, but they had no branching.
In the new Doom, where the lead engineer was the previous CryEngine lead engineer, he says they are done with this system and just use dynamic branching in only very few shaders instead, because today branching is pretty well supported on the GPU.
Basically every game today has some sort of screen space effects like for example Screen Space Ambient Occlusion and Reflections. These absolutely, all the time, use looping and often branching too.
That depends on the shading model (forward / deferred). In forward you have to find out yourself basically. It depends on how expensive the lights are and how many model x light variations can exist in the current budget.
If you use stuff like Tiled Lighting or Forward+ you can optimize this a bit.
In a deferred engine, depending on the implementation, hundreds or thousands light sources can be drawn, depending on their size on the screen, but you have some base costs and some limitations with your materials.
I’ve done both. In my actual 3d game - which you can see here https://www.youtube.com/watch?v=tvRTHaPNTyk&t=2s - I have implemented a forward rendering system and I think I support 40 or 60 lights at once. I’ve never tried more, since I didn’t need to. All my bullets etc. casts light, plus headlights, explosions and sun light.
For point lights in a straight forward fashion you can check out this thread: Struggling to find point light resources - #29 by wmccullough
For fun I made a deferred engine, too, which you can download here Deferred Engine Playground - download
In my opinion, unless you need a lot of lights, the forward way is easier and much more performant. Plus, if you want to have smoke / transparent things you have to make these parts forward rendered anyways again, so there’s that.