How do I render a Twig template and load a CSS file from a controller?
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.