I would recommend using Workspace ShapeCast or Workspace:Raycast(). In terms of performance, running a raycast does not have a strong performance impact compared to .touched().
To get the humanoid you could do [script instance]:FindFirstAncestor("Name of object containing humanoid").Humanoid
Hope this helps!