Getting the teaser text without overriding global variables

get_extended() saved me! The returned array has ‘main’ and ‘extended’ keys. Main has the text before the <!--more-->. The ‘extended’ key has the content after the <!--more--> comment.

$content = get_post_field( 'post_content', get_the_ID() );
$content_parts = get_extended( $content );
echo esc_html( strip_tags( $content_parts['main'] ) );