When the program exits, all goroutines die instantly. The doc is saying that the program does not wait for any goroutine to complete except the "main" goroutine (the one that invoked the function main at startup). If you do want to wait for other goroutines to exit before exiting the program, which is often something you do want, that can be done using sync.WaitGroup or other synchronization tools like channels. In the case of Tamas's goroutine, nothing in main waits for it, assuming the program isn't sent an interrupt signal, so the goroutine never "completes". It does "exit" though, because all goroutines are part of the program, and when the program exits, it exits entirely. Any goroutine that was running as part of the program isn't running anymore, and in fact doesn't even "exist" in any meaningful sense anymore.
You are correct that contexts can be used to inform goroutines when to perform cleanup steps and/or exit cleanly, but if you want to ensure that the cleanup actually completes, you need to wait for the goroutine to finish before returning from main (or running os.Exit, log.Fatal, panicking without recovering, etc.). Otherwise the goroutine may abruptly stop running at any time as the program exits.
I hope that helps to clarify the documentation for you.