If you're planning to instantiate many instances of the same prefab, you should definitely think about using object pooling. Calling Unity's Instantiate function is one of the most taxing method calls you could make.
Object pooling is when you instantiate prefabs before they are used. They are deactivated immediately upon instantiation and reactivated only when they are needed. While this does increase memory usage, it avoids the CPU overhead of instantiating during gameplay.
For example, I'm currently working on a bullet hell game that requires hundreds of bullets to be spawned at runtime. I initially tried to make the game without object pooling but that ended up being a disaster ( less than 2 fps). Now, I pool 500 bullets before the game starts and the game runs astonishingly fast (200 fps).
There are situations where object pooling cannot be used. For instance, if you have a game where player input dictates what prefab is spawned, then you may have no choice but to use the normal Instantiate call. Object pooling is only possible when you know ahead of time what objects will be needed.
Sebastian Lague's YouTube tutorial is a great resource for learning about object pooling: https://youtu.be/LhqP3EghQ-Q