Reactiveness, cpu and caches
CPUs are developed with typical code in mind. For example, indirect function calls are no problem - the destination of such a function call will be predicted, just as we do with branch prediction. 

Remember that "hundreds of cycles" are only "tens of nanoseconds". Typically, 3,000 cycles is just one microsecond. So if a programming pattern wastes "hundreds of cycles", that's no big deal and no reason not to use that pattern. "Traversing big collections of subscribers" - there are efficient methods for doing so.