Pagination for event query

posts_nav_link() works off the main query. Instead of invoking your own $upcoming, just use query_posts( ... ) to temporarily overwrite it, and the corresponding template tags…

query_posts(
    array(
        'post_type'      => 'tribe_events',
        'eventDisplay'   => 'upcoming',
        'posts_per_page' => 1,
    )
);

if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

        <?php tribe_get_template_part( 'list/single', 'event' ) ?>

<?php endwhile;

else : 
    echo 'no upcoming events'; 
endif;

wp_reset_query();