WHILE: Agreed. However, this sproc is called for Inserts and updates an average of 10x/day, so the perf hit is probably not noticeable.
As for the cursor, there are 2 related sprocs called for each row in hierarchy affected by a change in a keyword, each having some rather complex logic.
(I will NOT share the nested! cursor! solution we use to retrieve and present the keywords and data to which they are linked. But it generally runs in under 1 second, 20K times a day).