Способы обмена данными между PHP сценариями?
Вопрос поставлен не совсем корректно, т.к. может быть 2 трактовки:

1. Если речь идет о веб-скриптах, которые выполняются последовательно, то чем вам не нравится сессия? В данном случае это не костыль — она именно для этого и придумана. Если не нравится непосредственно стандартная реализация, то можно взять собственную (принципиально аналогичную): генерировать ID клиента (сессии) и передавать его через get/post/cookie (по вкусу), а уже сами данные хранить либо в файлах, либо в базе данных, и получать с помощью этого идентификатора в качестве ассоциативного ключа.

Непосредственно данные через куки, гет и пост передавать естественно в данном случае не стоит: эти вещи всегда можно подделать, т.к. они идут через клиента. Это можно назвать костылем :)

================
2. Если же речь идет о выполняющихся одновременно 2 шелл-скриптах, т.е. межпроцессное взаимодействие (IPC), то тут можно использовать разные более или менее системно-зависимых вариантов. От стандартных механизмов IPC: семафоры, сообщения, шаред блок памяти, до специфичных вещей вроде именованного пайпа или сокета; или же аналогичных п.1 вещей (база данных/файлы).
Хм, вы же сами все варианты перечислили. Другое пока не изобретено. Просто напишите плюсы и минусы в реализации для каждого, и выберите лучшее.
По мне, так ссылка должна выполнять GET-запрос, соответственно все данные в URL. Редиректить, чтобы скрыть что-то — ерунда какая-то.
Кнопка может выполнять пост-запрос.
Если очень-очень надо ссылку заставить делать POST-запрос, используйте javascript.
И GET и POST прозрачны для мониторинга. Чтобы параметрами в них не злоупотребляли используйте валидацию на серверной стороне. Отсекайте невалидные запросы.
Если надо хранить состояние между страницами, так, чтобы пользователь даже не знал, что вы там для него храните — используйте сессии, передавая в куки только идентификатор сессии, а не сами хранимые значения.