I don't know if this is "elegant" but it certainly works because your numbers come first...
In[1]:= GetMyNumber[str_String] :=
ToExpression[StringJoin@StringCases[str, DigitCharacter | "."]]
In[2]:= someNumbers = {"55", "12.7", "27%", "33.98%", "89", "91%abe"}
Out[2]= {"55", "12.7", "27%", "33.98%", "89", "91%abe"}
In[3]:= GetMyNumber /@ someNumbers
Out[3]= {55, 12.7, 27, 33.98, 89, 91}
Unfortunately something more elegant like using Interpreter["Number"] on your strings will not work since a number of the forms you have are not known number forms. Also, often using Interpreter[...] can be quite slow as it often uses the Cloud to do the interpretation.
But here is an example of the problem for a more general (semantic interpreter) case showing examples of an Interpreter working and not working on your examples:
In[4]:= Interpreter["InactiveSemanticExpression"] /@ someNumbers
Out[4]= {55, 12.7, Inactive[Quantity][27, "Percent"],
Inactive[Quantity][33.98, "Percent"], 89, Failure[
"InterpretationFailure",
Association[
"MessageTemplate" :> MessageName[Interpreter, "semantic"],
"MessageParameters" -> Association["Input" -> "91%abe"],
"Input" -> "91%abe", "Type" -> "Expression"]]}
Which may not format correctly in this forum