Internally, 'On collision' is not a real trigger even though it appears like one in the event sheet - it works like 'Is overlapping' with 'Trigger once' after it. This is for performance reasons (it would be difficult to avoid unnecessary collision checks if it was a real trigger).
Generally the performance of overlap tests is negligable unless you have hundreds of objects or more (see
spongehammer's link). However it's good practice to only have one overlap or collision test, and do everything you need to in subevents under that. If you have two 'On collision' or 'Is overlapping' events, it will re-check the overlap both times.
It could actually degrade performance to cache results, because if an object moves it has to remove any cached collision results. This means every time an object moves it has to do a little bit of work. Most games have a very large number of moving objects, which multiplies a little bit of work in to a lot of work. So I'm not sure that would actually make it faster.