Problem with that is that all clients end up firing at different times, and therefore each one sees different results. For a competitive shooter, that’s not really acceptable - you have to ensure that each player sees the same thing, or at least that the local player doesn’t feel disjointed. My approach has two RPC’s, the first is to start and stop firing, while the second is called ONLY from the local client and tells the server to actually create the projectile. Projectiles are then managed both locally and on the server, if they explode on a client they do everything they usually would aside from dealing damage, which only ever occurs on the Server. If the projectile explodes on the server first, it forces all clients to explode via replicated variable.
Remember that reliable RPC’s are bi-directional, the client has to tell the server that it was carried out, so they can actually consume more bandwidth than variables - at the cost of some precision.
There are also other situations where traces aren’t applicable. If you projectile can be affected by some outside force, such as other projectiles or physics volumes, syncing up the traces on Server and Client can get difficult unless you’re using a deterministic system. bNetTemporary is a godsend for Projectiles, so long as you can ensure all players stay in sync.
EDIT: Having thought this over some more, I actually fail to see the benefit of using traces to work out the flight paths of projectiles. The problem is, you either need to sync up every subsequent trace with the Server to ensure that the client is simulating correctly - or you need to just accept that the client may simulate differently to the server - at which point you can either allow the client to deal the damage on their end (which opens up the possibility for hacking / cheating), or you allow the client to simulate differently and accept that they may start hitting objects on their end but not on the server, which lets players feel cheated.
If you sync up the traces, you have to send RPC’s which is much more expensive than projectile movement replication. If you just want to allow the client to show different results, then you may as well just turn on bNetTemporary on the projectile and only send the initial replication byte, or not replicate movement at all and send an RPC to tell all clients to ‘fire’ a round.