The middleground I'm pitching is that that you run the simulation on the server and client, but give the client authority over moving and shooting.
The client simulates its local player movement at 60fps so there's no movement input lag, and it broadcasts the player position (coords, angle) to the server 20 times per second or something. This spares you from the hard topic of interpolating input desyncs and and client-side optimism.
The server updates client positions in its own simulation as they come in, and broadcasts snapshots to the clients. The clients just update enemy positions as the server broadcasts them. They'll be a bit choppy, but this spares you from the hard topic of interpolating old data.
The server simulation can be the authority of other things, like whether or not a player runs over a powerup, whether a bomb hits a player, the score, etc.
Pros:
Cons:
If I was smart enough to get lag compensation working on day 1, I'd do it. But I wasted many weekends trying to get it working, and I ultimately realized that it was a procrastination -- that I need to be working on the game.