Snippet not loading without its php wrapper also within snippet

I think what you are asking here are different use cases.

When you click on a link for a tag, you would usually be redirected to the list of articles, i.e. the blog page, with the only difference that this time, the articles should be filtered by tag.

So in your blog.php controller, you would use an if-statement, which checks if you filter by tag or not.

// blog.php controller
return function($site, $pages, $page) {
 
 if($tag = param('tag')) {
  $articles = page('blog')->children()->visible() ->filterBy('tags', $tag, ',');
} else {
  $articles = page('blog')->children()->visible();
}

  return compact('articles', 'pagination');

};

Unless you want to show these articles on the same page as the article page that is currently loaded, but then you would have to use some ajax script to load the articles into the same page when the tag is clicked?

As regards your archive, I’m not quite sure what you want to filter by, but in general, if would work in the same way and this thread could also be useful: Blog archive - filtering articles by months

Your related pages problem could be solved by passing the page variable:

<?php foreach($page->relevantreading()->pages() as $result): ?>
<?php snippet('result', array('result' => $result)) ?>
<?php endforeach ?>

BTW: Pls. wrap blocks of code within three backticks on a separate line before and after each block of code. Thank you.

Edit: in your archive list you can do the same

<?php foreach($site->page('blog')
                   ->children()
                   ->visible() 
                   ->flip() as $result): ?>
  <?php snippet('result', array('result' => $result)) ?>
<?php endforeach ?>