Если это так, я должен специализировать часто используемые шаблонные функции для передачи по значению вместо ссылки для примитивов с размером
В общем, нет. В шаблонных функциях почти всегда все их определения видны при вызове, что означает, что если ваш оптимизирующий компилятор (из которых MSV C очень хороший) видит возможность, он не будет сорван тем, какой путь вы выбрали.
Конечно, есть исключения из каждого правила, включая шаблоны, определения которых невидимы (и, например, используют явное создание экземпляров) и при вызове функции через указатель функции, а не по имени.
99,5% времени Вам не стоит об этом беспокоиться. Если вы хотите тратить время на производительность, потратьте его на профилирование.