I reccon the main difference is that with the latter, you restrict your trigger logic to your player implementation, so it's more of a design issue.
Consider that, one day, you wake up to a realization that your current player codebase can't handle some new issue and a refactor is in place. And then you see, well damn, all my triggers depend on this specific class to exist in this specific gameobject! Tread carefully, lest you break something.
Now, if you used tags, you could rename, remove, refactor to your heart's content, and things will (quite likely) just work.
My personal approach is to remove the object inspection logic away from triggers and whatnot. Triggers simply ask "Do you recognize this object that ran into me just now?", to which a third party inspects the object and says either "Yes" or "No". Depending on the answer, the trigger either ignores the event or proceeds to do whatever the trigger does.
(The third party in my case are ScriptableObject assets that I pass to the objects in the editor. An asset to identify the player, an asset to identify pickable objects, etc. This makes it easy to mish and mash functionality inside the editor, like turning a pick-up into a damaging entity, with no extra code involved)