Generally, you would want to use a junction table when your linked data changes (semi-)regularly, and when you want to have those changes reflected in the table that contains those links. I think of junction tables when I need editable data associated with a record in an external table to be pulled into the current table. In other words, if you have records that need a field to be filled based on many-to-one specified record in another table, then a junction table would be appropriate. I always think of pay rates at a company (Gareth’s example). In instances where you can allow for one table in your workflow (i.e. Projects) to reference fields from all other tables (Tickets, People, Companies, etc., the better time you will have understanding the relationships between those entities. In your case, it sounds like you want to prioritize using lookup fields (table->table) over junction tables (table->table->table).
In the practical case of #1, you could try having each role be a field in your companies table (that links to your people table), and inserting a lookup for each role in your project table that links to your companies table, so when you select a company in a record in your projects table, their employees show up in each role.