How to properly print a 404 error without redirecton? (i.e. keeping the current URL)

You should be using a filter outside of your template for this:

add_filter( 'template_include', 'wpa62226_template_include', 1, 1 );
function wpa62226_template_include( $template ){
    if( is_page( 'some-page' ) ) :
        global $wp_query;
        $wp_query->set_404();
        status_header( 404 );
        $template = locate_template( '404.php' );
    endif;
    return $template;
}

Your code is executed before the template is loaded, so it becomes a non-issue.