Wouldn’t say virtual calls are expensive (as in “OMG that’s expensive”), but they do require an extra look-up in the v-table when called. I’m pretty sure you’d have to do thousands of calls to find a measurable difference in the context of a gameloop. See: c++ - Difference between calling of virtual function and non virtual function? - Stack Overflow
Note for instance that Tick() is a virtual method. If virtual calls were prohibitively costly, the UE architecture probably wouldn’t look the way it does.