Given that you are making four separate function calls for each Event ID that you iterate through, 3000 records in 30 seconds might be an optimal result already.
What is it those function calls are doing to return the status? Is there any way you can combine them into fewer functions to save on the amount of exec statements that need to be evaluated and processed?
If there is any way you can avoid a cursor in the first place, you will probably see significant performance improvements. Cursors are handy but typically slower. Could you replicate what the entity function is doing in a CTE or temp table and then join that table to the access/privilege tables to determine the access for each user?