Additional fields or intersection table
Using an intersection table is a cleaner and more flexible design.  

With extra columns you are limited to the number of instances you can include (one per foreign key column).  Also, the types of instances are limited to those given by your FK columns.  Making any changes requires a table design change.  Also, since your roles are optional, you may have a lot of nulls in your FKs.  Having sparsely populated columns rubs some people the wrong way.  Whether this is a real design problem or just a "code smell" is debatable and depends on how you actually populate your table.

With an intersection table, you can either use constraints to enforce a single instance per type or you can allow multiple instances per type.  That might prove useful in the future if you start having contacts share a role.

Also, with an intersection table, you can create a new role without having to make a table design change.  This could save you a lot of work in the future.