How safe is renovating $wp_query when doing WP_Query pagination in Page Template

This question is opinion based, so the answer can be opinion based too. I assume that, if you need to paginate the posts, you are building a page template to look like an archive page. In this case I totally recommend to use an archive page and to use pre_get_posts action hook for filter the posts if needed.

Why?

Hooking in pre_get_posts action allow you to alter the query for your needs before the main query is executed.

If you let the main query as is, it is executed by WordPress in order to determine what page to display and then, in the page template, you create a second query to display what you want. It is like leaving WordPress build all the process and when the content are going to be printed, you say: NO!! Go back and make another query becasue what you have is not what I want to display!! (yes, it is more job to do!!)

Secondary queries and secondary loops can be useful and needed in a several situations, for example in widgets to display latest posts from a certain category, but don’t use them if the result of the secondray query/loop are going to be the main content of the page.

Messing with the global $wp_query in a page template can get you to undesired results; At this point the global $wp_query is a reference to a query that was already executed and its values may be used in other parts of the script, so it is not safe messing with it. In the case you need a secondary loop/query, you must use ALWAYS a new WP_Query object and call to wp_reset_postdata() after the secondary loop; or use get_posts() function. Finally, according with the Codex, in a page template the pagination parameteres for a new WP_Query object may need get_query_var('page') instead of get_query_var('paged').