First you have to define what you mean by 'overhead'. If you restructure a super loop design, that is spending most of the CPU cycles doing nothing other than polling interfaces and spinning in a loop, into an event driven mutl-threaded design, that only ever uses CPU cycles when there is actually something to do, then the overhead of the tick is negative. That is, it can save you huge amounts of time.
As you might expect, the overhead of the tick interrupt depends on the FreeRTOSConfig.h settings.
For the best performance, but also the least amount of development support, use the following settings:
configUSE_PORT_OPTIMISED_TASK_SELECTION 1
That will make the selection of the next task use a single CLZ (count leading zeros) instruction, with the limitation that you cannot have more than 32 priorities (0 to 31).
configCHECK_FOR_STACK_OVERFLOW 0
That will turn off both forms of stack overflow checking, which is actually the thing that takes the longest in the tick interrupt when it is on.
configGENERATE_RUN_TIME_STATS 0
That will turn off data collection.
Also, if you want the fastest performance, don't use the trace functionality either.
Depending on the application you are writing, you can turn the tick off during idle periods.
Hope this helps.