Help needed getting out of the habit of using TWIG as my Controller and Template files
You are right, this kind of code should be in your controller or in preprocess functions.
You should generate a  render array for each twig template, to be able to have a simple :

{{ image_with_zoom }}


In your twig file. Your controller could have something like :

  $renderArray = [];
  /* @var $item \Drupal\node\Entity\Node */
  if($item-&gt;field_main_images-&gt;count()){
    $image = File::load($item-&gt;field_main_images-&gt;target_id);
    $renderArray['image_with_zoom'] = [
      '#theme' =&gt; 'image_style',
      '#style_name' =&gt; '...',
      '#uri' =&gt; $image-&gt;getFileUri(),
      '#attributes' =&gt; [
        'data-zoom-url' =&gt;  ImageStyle::load('item_zoom')-&gt;buildUrl($image-&gt;getFileUri())
      ]
    ];
  }


Have also a look at field formatters, it allow you to get your own controls for each field you wish to display.
You can generate some skeleton with the drupal command :

$ drupal gpff


Have a look at documentation on this point, and the one in the drupal console. That's quiet important if you wish to reuse some display for a particular field as it looks like.