When it really comes down to it, you don't *have* to do a darned thing. Try looking at it another way.
The page actually being executed is usually index.php (in the blog root folder). This is the starting point of the whole application. It calls the wp-blog-header.php, which does the heavy lifting. This loads the blog config file, executes the main blog functionality and loads it into memory, and then ends up calling template-loader.php.
template-loader.php determines what sort of thing is being called and loads the proper template for it. If the template exists, then it runs. If not, then it ends up falling through to the theme's index.php file.
Now, the naming structure of theme's is well defined, but ultimately only a suggestion. Parts of the blog are hardcoded to expect these filenames, but you could have the whole thing in index.php if you really wanted to. Because in the end, index.php is the main thing usually getting run. get_header(), for example, is a simple function call that loads/runs the theme's header.php file if it exists, or the default theme's header.php file if it doesn't. But it's not necessary to make that call at all, you could just put the headers stuff directly into the index.php if you wanted to. The reason it's broken out separately is because you may have other main templates that use the same header (like single.php or what have you).
What I don't understand is why only index.php works with get_header() and get_footer() functions... and you can't link to other pages that you put in your theme folder without including "/wp-content/themes/(theme_name)/" in the url...
Because get_header() actually does this:
load_template( TEMPLATEPATH . '/header.php');
(load_template() actually basically only does a require_once($file);, along with some sanity checking)
If you want to include stuff in the template folder, try using the variables like TEMPLATEPATH. It'll make things easier.