If you start a normal program (not script) from a shell, a child process is used to run that program.
If you start a script, the script is examined to figure out which (shell) program to start. Subsequently, a child process is used to run that program (could be anything from bsh, sh, to perl or even a custom build program) and the script is executed by that process.
The . notation executes the script in your current 'shell'.
You are correct: If you do not leave the started (shell) program, you will have to 'exit' that shell, and the shell you were originally in.
When starting with the . notation, you do not start a second process, which thus does not have to be exited.