У тебя самая примитивная система спавнпоинтов (Которая к слову не работает нормально с несколькими людьми из-за @p. Снизу исправленная команда).
execute as @a at @s if block ~ ~-0.1 ~ minecraft:gold_block run spawnpoint @s
Тебе нужно добавить проверку, стоит ли у человека уже на этом месте спавн. Прийдётся переделывать всё с помощью маркеров и проверять, совпадают ли при спавне координаты маркера с координатами, где у игрока стоит спавн. В общем, это замороченно, ты вряд-ли такое будешь делать.
Можешь попробовать прикрутить к этому костыль, но это может забагаться. Создай счёт, который считает время после смерти.
scoreboard objectives add time_since_death minecraft.custom:minecraft.time_since_death
Потом, если человек только заспавнился, не ставить ему спавн и не выполнять всё остальное.
execute as @a[scores={time_since_death=60..}] at @s if block ~ ~-0.1 ~ minecraft:gold_block run spawnpoint @s
Можно ещё сделать систему с тегами, что когда игрок умер ему даётся тег не ставить спавн (NoSpawn), а когда он заспавнится и уйдёт с золотого блока снимать этот тег с него. Но это всё равно костыльно и не решит проблему полностью.