Tested on the current trunk and watchers are deleted when an issue is deleted.
Before:
D, [2020-04-20T14:49:48.968211 #66] DEBUG -- : Watcher Load (0.7ms) SELECT `watchers`.* FROM `watchers` LIMIT 11
=> #<ActiveRecord::Relation [#<Watcher id: 362429562, watchable_type: "Issue", watchable_id: 2, user_id: 1>, #<Watcher id: 580717795, watchable_type: "Message", watchable_id: 1, user_id: 1>, #<Watcher id: 999578971, watchable_type: "Issue", watchable_id: 2, user_id: 3>, #<Watcher id: 999578972, watchable_type: "Issue", watchable_id: 4, user_id: 4>, #<Watcher id: 999578973, watchable_type: "Issue", watchable_id: 2, user_id: 4>]>
irb(main):002:0> Watcher.all
After I've deleted Issue#4
D, [2020-04-20T14:50:13.301428 #66] DEBUG -- : Watcher Load (0.7ms) SELECT `watchers`.* FROM `watchers` LIMIT 11
=> #<ActiveRecord::Relation [#<Watcher id: 362429562, watchable_type: "Issue", watchable_id: 2, user_id: 1>, #<Watcher id: 580717795, watchable_type: "Message", watchable_id: 1, user_id: 1>, #<Watcher id: 999578971, watchable_type: "Issue", watchable_id: 2, user_id: 3>, #<Watcher id: 999578973, watchable_type: "Issue", watchable_id: 2, user_id: 4>]>
For issue move, the watcher should not be deleted automatically, but there is a new issue to mark them as invalid (when the watcher watches a non visible object, please see #33329).