: square dup * ;
is going to generate a square word that does 2 calls, regardless of whether "dup" and "*" are native words or not.
The equivalent in C:
int square(int x) { return x*x; }
will generate code that contains no call, even if your C compiler is not a very optimized one.
With STC, it becomes possible for an elaborate Forth to inline "dup" and "*", but STC is less popular on the 8-bit architectures you mentioned because it's much less compact.
It's in that context that I mention that threaded code entails a speed tax. It's those 2 calls.
Of course, in your Forth system, you could rewrite "square" in native code to get rid of the penalty, but then it's not threaded code anymore, it's native code.