This will depend on the situation. The not in is recommended when you already have the values and passes as a parameter, for example:
select * from tbl where status_id not in (1,3,7)
Now if you are going to make a subselect I recommend using not exists, because in the first result that it finds it will already validate and move to the next record.
select * from user u where not exists (select 1 from player p where p.user_id = u.id limit 1)
Since I do not need the fields in the player table, return 1 is faster than *. The limit 1 (changes the way of writing according to the database) will cause that when finding 1 record already is enough to say that it exists. Update: In some situations limit 1 may leave faster according to this response .
I hope it has become clear.
Performance: As Paul quoted in the answer below, not exists allows you to use index, which in tables with many records can greatly improve performance against not in.