So generically, I can imagine FE guns on Roblox are made through this:
damageEvent:FireServer(humanoidHit, damageAmount)
But also there are exploiters, exploiters can fire these events replacing damageAmount to numbers like 1,000 and can cycle through the player list to insta kill them. I thought the way to get around this is to make the raycasting stuff within the server, but of course when a player has a gun that fires 7 rounds a second, I have a feeling it could exceed the 50kbs/sec data limit that's being passed. How do i go about this in the most efficient but anti-exploiting way?
(Assuming from your code example)
What you're currently doing is prone to get exploited. You should never ever trust the client, no matter what. This is why filtering enabled exists, to prevent the server from trusting the client.
Currently, you're just allowing the client to do anything. You should just think that the client is a notification provider, that tells the server whenever the client wants or wants to do something.
For example, if you want to fire a gun, (as a client) you don't make the server shoot your gun. You "kindly" ask the server to make the gun shoot. Then, it's the server's job to validate the client's request. For example checking where they're looking at (server-sided), making sure they're not shooting faster than what they should, etc.