you need to benchmark all varieties to determine if a join scales better than a subquery (or vice-versa).
An 'IN' clause can work great if you are working against NOT NULL columns within the subquery (like a PK). Sometime an EXISTS clause is better if you know you only need to check for an existence of at least one row.
Joins are more efficient sometimes if you need columns from the joined table.