Render a field from an entity reference in twig template?
After some more thought and research, I think the best approach to this problem is to use a theme pre-processor function to manually prepare the entity reference field.

The main issue is that the referenced entity has a formatted text field that I need to output. That means it needs to run through the formatter before it's considered safe for output.

Manually accessing the value through the entity object in Twig is not a good solution because it will just print the raw value from the database, which twig will by default escape. Tacking on |raw makes it unsafe because it still hasn't run through the text processor.

Here's a preprocessor snippet that does what I need:

/**
 * Implements hook_preprocess_node().
 */
function MY_THEME_preprocess_node(array &amp;$variables) {
  $node = $variables['node'];
  if ($node-&gt;bundle() == 'news') {
    // Extract the caption from the cover image media entity and prepare it manually. We do this because in our template, we render the caption separately from the image.
    if (!$node-&gt;field_news_cover_image-&gt;isEmpty()) {
      $image_media_entity = $node-&gt;field_news_cover_image-&gt;entity;
      $caption_field = $image_media_entity-&gt;field_media_caption;
      // Caption is formatted text, so we must output a render array that will
      // process the text with the appropriate filter.
      $variables['cover_photo_caption'] = [
        '#type' =&gt; 'processed_text',
        '#text' =&gt; $caption_field-&gt;value,
        '#format' =&gt; $caption_field-&gt;format,
        '#langcode' =&gt; $caption_field-&gt;getLangcode(),
      ];
    }
  }
}


This allows me to simply print {{ cover_photo_caption }} in the twig template.