I think probably the cleanest way to do this (at least, if you have only a single string, or are faced with a separate string for each number you wish to convert as a result of some other process) is to use the undocumented function ``Internal`StringToDouble``, i.e.:

 s = "1.23e-5";
 Internal`StringToDouble[s]

which gives:

 0.0000123

However, if you are trying to convert many such numbers at once, the standard, documented methods (`Import`, `Read`, etc.), are likely to represent better approaches.

UPDATE: As of at least [version 12.3][1] the proper way to invoke this is:

 Internal`StringToMReal["1.23e-5"]

 [1]: https://mathematica.stackexchange.com/questions/246449/is-internalstringtodouble-broken-in-12-3