Нету тут никакой магии с клонированием.
Для начала давайте разберемся что хранит $instance. Хранит оно ССЫЛКУ на объект а не сам объект. При простом присвоении по значению происходит копирование значения переменной, а оно у нас просто ссылка на объект. В итоге у нас уже две ссылки на один объект.
При присвоении переменной $reference значения по ссылке, у нас две переменные делят одно и тоже значение. А значение это - ссылка на объект.
Когда мы затираем ссылку в $instance, то есть мы меняем значение оной, оно же меняется и у $reference так как они делят на двоих одно значение. $assigned же имеет свою ссылку на объект.
$instance = new SimpleClass(); // количество ссылок на экземпляр SimpleClass - 1
$assigned = $instance; // количество ссылок на экземпляр SimpleClass - 2
$reference =& $instance; // количество ссылок на экземпляр SimpleClass - 2
$instance = null; // количество ссылок на экземпляр SimpleClass - 1
Как только у нас не останется ссылок на экземпляр класса, сборщик мусора удалит объект.
А что до клона - если бы объекты бы копировались, начался бы ад, так как объекты хранят другие объекты, которые могут делить между другими объектами... словом там слишком сложно все становится и пусть уж лучше программист это в __clone сам разруливает.