Here are 2 other options.
WITH Contacts AS(
SELECT INS.INSPNO, CNT.FIRSTNAME, CNT.LASTNAME, CNT.CAPACITY,
ROW_NUMBER() OVER( PARTITION BY INS.INSPNO ORDER BY CASE WHEN Capacity = 'Contractor' THEN -1 ELSE INS.INSPNO END DESC) rn
FROM @inspection INS
INNER JOIN @INSPECTIONCONTACT CNT
ON INS.INSPNO = CNT.INSPNO
)
SELECT INSPNO, FIRSTNAME, LASTNAME
FROM Contacts
WHERE CAPACITY <> 'Contractor'
OR rn = 1;
SELECT INS.INSPNO, CNT.FIRSTNAME, CNT.LASTNAME
FROM @inspection INS
INNER JOIN @INSPECTIONCONTACT CNT
ON INS.INSPNO = CNT.INSPNO
WHERE CNT.CAPACITY <> 'Contractor'
UNION ALL
SELECT INS.INSPNO, CNT.FIRSTNAME, CNT.LASTNAME
FROM @inspection INS
INNER JOIN @INSPECTIONCONTACT CNT
ON INS.INSPNO = CNT.INSPNO
WHERE INS.INSPNO IN ( SELECT C.INSPNO FROM @INSPECTIONCONTACT C
GROUP BY C.INSPNO
HAVING MAX(C.CAPACITY) = 'Contractor'
AND MIN(C.CAPACITY) = 'Contractor')