In terms of getting references to scripts, is it better to use static/singleton component scripts or use GameObject.FindObjectWithtag()… method.
Static/singleton scripts are good if you actually need them. Static references are good when you don’t care about individual states, since every object of those classes will contain the same internal state values. There are several ways to get the game objects even inside the same project, IMO the best way will depend on your project and each particular of that project. Plan it beforehand, and use the ones you need.
Edit: here’s an example of a bad use of a static reference, triggering a hard to track bug
I wanted to have a single instance of a network manager and single instance of a screen fader logic running.