I think a solution based on pattern matching will be much faster than ones based on `Element` (which is more mathematical in usage) or pattern tests or anythign else that forces evaluation, since we can bypass the main evaluator.

    ClearAll@realQ
    SetAttributes[realQ, Listable]
    realQ[_Real | _Integer | _Rational] := True
    realQ[_Symbol?NumericQ] := True
    realQ[Complex[_, 0.]] := True
    realQ[_] := False

    realQ[{"text", 0, 3.0, 1/2, I}]
    (* {False, True, True, True, False} *)