An instrumenting profiler records every function call, which changes the timings it is measuring — small fast functions look disproportionately expensive because the overhead is per call.
# instrumenting: exact counts, distorted timings, huge overhead
# xdebug + cachegrind, locally, for a specific question
# sampling: statistical, low overhead, safe on a live system
# a periodic snapshot of the stack, aggregated
# the question each answers:
# instrumenting — how many times is this called?
# sampling — where is the time actually going?
Sampling belongs on a production host because the overhead is a fraction of a percent and the results reflect real traffic rather than a synthetic request. Mixing the two up is how a team spends a week optimising a function that appeared expensive because it was called two million times cheaply. Both are better than the third option, which is adding microtime() calls and reasoning about the numbers.