When we reach for it
Any numerical work, and specifically for making an analysis fast enough to run in a pipeline rather than overnight. The difference is not marginal: it is frequently a pipeline that finishes inside the window it has rather than one still running when somebody needs the output.
When we would argue against it
Nothing directly — but a loop written in Python over an array is the most common performance defect we find in inherited analysis code. They are libraries rather than an architecture, and a pile of array manipulation with no tests and no schema will still break silently when its input changes shape.
What it looks like in delivery
Vectorised operations rather than loops, and array shapes asserted at boundaries so a silent broadcast cannot corrupt a result. Pinned versions and validated inputs too, because the failure mode here is not a crash — it is a number that is quietly wrong and believed.