а как?
1) заменять указатели дескрипторами;
пример из доклада: использовать uintptr и кастовать его в *T при необходимости; утверждается, что в стандартной библиотеке Go такое часто делают;
2) минимизировать количество копий указателей;
чтобы сборщик не удалил объект, достаточно сохранять всего 1 указатель на него; остальные указатели по возможности заменить на слабые uintptr; в идеале хранить 1 указатель на слайс однотипных объектов, не хранить указатели на индивидуальные ячейки слайса, вместо них хранить индексы или uintptr;
3) хранить максимум данных в специальных областях памяти, несканируемых сборщиком;
например, в sync.Pool или в кастомном аллокаторе написанном кривыми добрыми руками (в докладе есть пример); при этом можно хранить указатели на объекты в этой области памяти, gc не будет по ним следовать вообще (кастомный вариант) или будет следовать по ним с большей эффективностью (вариант sync.Pool), т.к. область памяти специальная и сборщик про это знает.