Performance-wise, there are two main classes of cuts: (i) normal cuts, and (ii) global or "deep" cuts (definitions may vary between fields, this is what we use in deterministic global optimisation).
Deep cuts are globally valid, i.e., they are valid at every node of a branch-and-bound tree. This is usually the most desirable type of cut, because we don't have to change the coefficient matrix too much (or at all) when we create a new node.
Every cut that is not deep, is normal, and not necessarily globally valid. These are situational, but often crucial to close the last few % of the optimality gap and converge.
Cuts are nearly always good from a theoretical point of view, the problem is that they make relaxations harder to solve so there's always a tradeoff. The rule of thumb is to add as many deep cuts as you can afford in the beginning (you can measure the tradeoff by resolving at the root node a few times with more cuts), and then add other cuts where necessary. This can be done dynamically by creating and keeping track of a pool of cuts.
Ruth Misener has documented the dynamic approach very well on her papers about the GloMIQO solver.