Be careful while looking for GameObjects at runtime, as this can be resource consuming. Especially : don't run FindObjectOfType or Find in Update, FixedUpdate or more generally in a method called one or more time per frame.
Findonly when necessary
FindGameObjectWithTaghas very good performance compared to other string based methods. Unity keeps separate tabs on tagged objects and queries those instead of the entire scene.
Besides the methods that come with Unity, it's relatively easy to design your own search and collection methods.
In case of
FindObjectsOfType(), you could have your scripts keep a list of themselves in a
static collection. It is far faster to iterate a ready list of objects than to search and inspect objects from the scene.
Or make a script that stores their instances in a string based
Dictionary, and you have a simple tagging system you can expand upon.