Target relabelling occurs *before* the scrape takes place; metrics relabelling occurs *after* the scrape has taken place.
If you're just adding fixed labels to every metric, then either way will work. However I'd expect target relabelling to be more efficient, since it's only run once for each target, whereas metric relabelling is run once for every individual timeseries returned in the scrape.
Otherwise:
* If you want to set any labels which affect how the scrape is done - for example changing the metrics_path or adding query parameters when communicating with the exporter, or changing the address or port scraped - then this has to be done in target relabelling.
* If you want to label some returned timeseries differently to others, or selectively drop timeseries, then this has to be done in metric relabelling.