Автозагрузка обязывает указывать namespace у всех классов?
1) С точки стандартов программирования, насколько правильно указывать у каждого класса namespace?  да, это правильно. Один файл, один класс, который должен лежать в определенном пространстве имен.

2) Какой подход для использования spl_autoload_register из двух перечисленных является более правильным? Второй. Ибо это стандарт. "Вызывать несколько раз, в качестве аргумента указав функции, подключающие классы из разных директорий" - это когда у тебя мешанина из кода и ты пытаешься всё это натянуть на современные реалии. 

Сейчас дефакто композер стандарт, не изобретай велосипед, не стоит заморачиваться на то, что само по себе практически не используется (spl_autoload_register) в проектах.

1. Возьми композер (у меня под виндой phar работает, если запускать через php), инициализируй его у себя в проекте: 
php ../composer.phar init

2. Создай в корне директорию в app с именем Test - это будет пространство имен App\Test, туда положи файл Test.php, в котором объяви класс Test с указанием пространства имен namespace App\Test;

3. В файле composer.json допиши: 
{
.....
    "autoload": {
        "psr-4": {
            "App\\": ["app/"]
        }
    }
}
где app - будет весь код твоего приложения, те твоих чудо-классов.
Запусти php ../composer.phar dump-autoload

3.  Подключи лишь одну строку: require('./vendor/autoload.php');в файл индекса или в те файлы, где нужны классы с автоподгрузкой.

4. Должно получиться это: 

С точки стандартов программирования, насколько правильно указывать у каждого класса namespace? 
Других вариантов нет.

Ведь так можно легко запутаться, да и код начинает содержать символы, которых раньше мог миновать. 
Это какая-то белиберда на которую я даже не знаю, что ответить. Пространства имён служат для того чтобы не путаться. Про символы вообще непонятно

 Какой подход для использования spl_autoload_register из двух перечисленных является более правильным
Второй