No, devi farla sempre prima di qualsiasi Output
Assolutamente falso, puoi farlo anche dopo un output, basta solo catturare l'output e non inviarlo subito (per modo di dire).

Ci sono delle funzioni apposite in PHP per non inviare l'output prima della fine dell'esecuzione dell'intera pagina.

Sono le funzioni Output Control Functions, le trovi nel manuale PHP e c'è anche un articolo su freephp.

Con queste funzioni puoi usare quanti echo o print vuoi prima di un setcookie() o header() e non darà nessun errore.