Se o procedimento armazenado foi criado usando EXECUTE AS CALLER (que acredito ser o padrão), o chamador deve ter todas as permissões necessárias para fazer o que o procedimento armazenado faz além de EXECUTE no procedimento.
Da documentação do SQL Server para EXECUTE AS:
Observe que, devido à maneira como o SQL Server processa as verificações de permissão usando cadeias de propriedade, isso nem sempre é estritamente verdadeiro, e suponho que conceder CONTROL no procedimento (que confere status de propriedade ao beneficiário) está fazendo com que essas verificações de permissão sejam contornado.
Se você criar o procedimento com EXECUTE AS OWNER, não precisará conceder nenhuma permissão além de EXECUTE no procedimento.