Ну если выбирать из твоих первых двух вариантов, то я бы выбрал первое, так как TCP роднее и надежней. (UDP - быстрый, но твои пакеты развалятся пока дойдут)
А вообще, лично я использую асинхронные TCP-сокеты, тк считаю, что это дает максимум производительности. Хотя запара ещё та.
По поводу передачи данных, думаю, байты - самый оптимальный вариант.
Плюс в шарпе есть очень хороший ThreadPool и объекты синхронизации, что так же может ускорить твой сервер.