Передать контекст с отменой или канал done. При получении сигнала (SIGTERM) вызвать cancel() или закрыть done. Горутины проверяют ctx.Done() или <-done и выходят. Дождаться завершения через WaitGroup или errgroup.
ctx, cancel := context.WithCancel(context.Background())
go func() { <-sig; cancel() }()
g, ctx := errgroup.WithContext(ctx)
g.Go(func() error { return runServer(ctx) })
g.Wait()