The first will overwrite the value of instance every time Awake is run. This is useful if you want to create a static reference to a script but you don’t plan to have the script float. By definition, this is not a singleton.
The second is a singleton pattern. It checks if Instance has a value, and if not, it assigns the script to it and sets the gameobject to not be destroyed (thus is floats between scenes). If it has a value, then it destroys the new copy. You have to do this to avoid having multiple copies of a script that you only want one of. Like a GameManager script or AccountManager.
Yes indeed, as long as you keep in mind order of initialization. All Awakes will be called before all Starts, assuming all objects are in scene and enabled.
Beware that you may hear chuff from computer-science-y people about how the above is an anti-pattern. Fortunately such patterns exist to help us who actually make and ship games deliver them in a timely fashion.