Felet är i stort sett vad det betyder eftersom du inte kan agera på två saker av samma "sökväg" i samma uppdateringsoperation. De två operatorerna du använder bearbetar inte sekventiellt som du kanske tror att de gör.
Du kan göra detta med så "sekventiell" som du möjligen kan få med "bulk" operations API eller annan form av "bulk" uppdatering. Inom rimliga gränser förstås, och även omvänt:
var bulk = db.coll.initializeOrderedBulkOp();
bulk.find({ "tags": 1 }).updateOne({ "$addToSet": { "tags": 2 } });
bulk.find({ "tags": 1 }).updateOne({ "$pull": { "tags": 1 } });
bulk.execute();
Inte en garanti för att inget annat kommer att försöka ändra, men det är så nära som du för närvarande kommer.
Se även det råa "update"-kommandot med flera dokument.