What’s going on here is that you need to take into account that Roblox uses distributed physics: Physics for a given part is simulated on the whichever client “owns” that part. That means that if you listen for a Touched event on that part that is owned by some other client, you will see a replication delay between the the client who owns the part seeing a touch happen, and them sending a message across the network to everyone else letting them know that the Touched event should fire.
You can control this by calling
Part:SetNeworkOwner(nil) to force server ownership). If you make this call to set the ownership, then Touched events for that part should always be instantaneous on the client/server you set the ownership to, since they’re the one doing the physics simulation now.