ID is not unreliable, it does what it is programmed for.
Calculated Formulas are processed before a new Item is written to the database where it gets an ID.
That is why ID is empty for New items but has the correct ID when an Item is changed/updated.
If you need ID in a Formula you have to trigger that update for newly created items, simplest is to create a Workflow triggered on New Item which writes the ID value to a extra column MyID.
The Workflow runs after the item is written to the database so picks up the correct ID value.
If you do not want an extra column you can also use a Workflow to overwrite any other field with the existing value, this will trigger an Item update as well.
http://www.viewmaster365.com/#/Create/4 has a detailed explanation.