The upside to option #1 is that it can significantly reduce deployment times. In one organization I worked at, I was able to reduce the deployment times from 45 minutes to 15 minutes simply by disabling triggers during @testSetup methods and other test initialization methods (most tests started off with @isTest static void test() { initialize(); ... }
). Aside from that, it allows to see which unit tests are actually testing your triggers via a simple code coverage report. You also reduce the risk of artificial governor limit failures that would not be a problem in production.
The downside to this technique is that you need to make sure you accurately model the data as if the triggers had executed. This is usually accomplished by way of a Test Data Factory class. Failure to set the data appropriately can hide logic bugs.
The upside to option #2 is that will more accurately generate data as if it were created "for real". This reduces the amount of time spent maintaining the Test Data Factory class, and can help highlight problems with changes to the system that invalidate some base assumption about the data model.
As you might imagine, the downsides to option #2 are the the opposite upsides for option #1. Namely, you'll have a bunch of unit test code coverage for tests that were not actually testing those triggers, and worse, if you forget a unit test class for a trigger, you'll never really know, because the test coverage will show they were covered (oops!). Also, deployment times can be significantly longer if you do this. Finally, you won't get "real" governor limit usage with this technique, and your tests may fail artificially, even though the code will never hit those limits in production.
I personally prefer option #1, as it makes deployments faster and more accurate, and the associated risks are minimal with some discipline. You have to consider how frequent your deployments are and the risks associated with either option. The only advice I can give is that you stick to one or the other for consistency.