How do I render a Twig template and load a CSS file from a controller? Is this considered a good practice for rendering a Twig template and loading a CSS file from a controller? 

DefaultController.php

namespace Drupal\acme\Controller;

use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Template\TwigEnvironment;

class DefaultController extends ControllerBase implements ContainerInjectionInterface 
{
  /**
  * @var Drupal\Core\Template\TwigEnvironment
  */
  protected $twig;

  public function __construct(TwigEnvironment $twig)
  {
    $this-&gt;twig = $twig;
  }

  public static function create(ContainerInterface $container)
  {
    return new static(
      $container-&gt;get('twig')
    );
  }

  /**
   * hello
   * @param  string $name
   * @return string
   */
  public function hello($name) 
  {

    $template = $this-&gt;twig-&gt;loadTemplate(
      drupal_get_path('module', 'acme') . '/templates/hello.html.twig'
    );

    $markup = [
      '#markup' =&gt; $template-&gt;render([ 'name' =&gt; $name ]),
      '#attached' =&gt; [ 'css' =&gt; [
          drupal_get_path('module', 'acme') . '/assets/css/acme.css'
        ]
      ]
    ];

    return drupal_render($markup);
  }
}


acme.routing.yml

acme_hello:
  path: '/acme/hello/{name}'
  defaults:
    _content: '\Drupal\acme\Controller\DefaultController::hello'
    _title: 'acme Title'
  requirements:
    _permission: 'access content'


hello.html.twig

&lt;div class="acme-hello-text"&gt;
  &lt;h1&gt;Hello {{ name }}!&lt;/h1&gt;
&lt;/div&gt;
As far as I understand, the controller should just contain the following code.

class DefaultController implements ControllerInterface {
  public function hello($name) {
    $twig = $this-&gt;container-&gt;get('twig');
    $path = $this-&gt;templateDir . 'hello.html.twig';
    $template = $twig-&gt;loadTemplate($path);

    return [
      '#markup' =&gt; $template-&gt;render(['name' =&gt; $name]),
    ];
  }
}


See also Drupal 8: An Introduction to the New Production.

I still have to find a reason to do this, thought. hook_theme() is still supported by Drupal 8, and it doesn't seem it is getting deprecated, at this time. The only difference is that in Drupal 8, theme() has been renamed _theme(); as such, it should not be called directly.
Since you are asking if your code is considered good practice, I would say no: You should do as you did with Drupal 7, defining a theme function in hook_theme() that uses a template. Then return markup similar to the following one in your controller method.

[
  '#theme' =&gt; $your_theme_function,
  '#name' =&gt; $name,
];


Replace $your_theme_function with the theme function ID, and #name with the array index used for 'variables'.
Actually, there is a difference between Drupal 7 and Drupal 8: While Drupal 7 allows you to attach JavaScript and CSS, Drupal 8 allows you to attach just libraries, which are a set of JavaScript and CSS files with dependencies.