Very surprising that LengthWhile is so slow, perhaps because it is not compiled? while any pattern-matching is (either directly or JIT).
If you know that is in 'ordinary' number then you can speed it up even more. Function-testing is much slower than checking the Head of an expression. Also NumberQ instead of NumericQ can be a bit faster. It all depends on what you consider a number... (btw you could also add |_Complex if you like...
tList=RandomChoice[{a,b,c},1000000];
tList[[777777]]=1;
Position[NumericQ/@tList,True][[1]]//AbsoluteTiming
Position[tList,_?NumericQ,1]//AbsoluteTiming
Position[tList,_?(NumericQ[#]&),1]//AbsoluteTiming
FirstPosition[tList,_?NumericQ,1]//AbsoluteTiming
FirstCase[tList,_?NumericQ]//AbsoluteTiming
SelectFirst[tList,NumericQ]//AbsoluteTiming
(LengthWhile[tList,Not@*NumericQ]+1)//AbsoluteTiming
BarChart@{Position[NumericQ/@tList,True][[1]]//AbsoluteTiming,Position[tList,_?NumericQ,1]//AbsoluteTiming,Position[tList,_?(NumericQ[#]&),1]//AbsoluteTiming,FirstPosition[tList,_?NumericQ,1]//AbsoluteTiming,FirstCase[tList,_?NumericQ]//AbsoluteTiming,
SelectFirst[tList,NumericQ]//AbsoluteTiming,
SelectFirst[tList,NumberQ]//AbsoluteTiming,(LengthWhile[tList,Not@*NumericQ]+1)//AbsoluteTiming,
FirstPosition[tList,_Real|_Integer,1]//AbsoluteTiming,
FirstCase[tList,_Real|_Integer]//AbsoluteTiming
}[[All,1]]
