You can use FIND_IN_SET(str,strlist) to check existence of a string in a list of comma separated values.
Change:
SELECT * FROM companion co
LEFT JOIN citizenship ci
ON co.citizenship_id = ci.citizenship_id
WHERE co.companion_id IN( SUBSTRING(v_companion_list,
1,LENGTH(v_companion_list)-1));
To:
SELECT * FROM companion co
LEFT JOIN citizenship ci
ON co.citizenship_id = ci.citizenship_id
WHERE FIND_IN_SET( co.companion_id, v_companion_list ) > 0;