Like so many architectural questions, it can be a balancing act.
Certainly one benefit of having a 3-tiered web application split into having each tier on separate machines is that you can now potentially load-balance, separately, the various parts of the application. For example, you could have 3 web servers serving up only the GUI, this "cluster" would connect to a "cluster" of 3 application servers, all nicely load balanced and seen as a single "instance" to the web servers. Likewise, a similar situation with the DAL (Data access layer).
Separating the tiers in this way also allows a certain level of "decoupling" of the layers of the overall application. This allows each layer to be setup differently (i.e. could use different hardware or different OS etc.) and so long as the interface remains consistent, there shouldn't be a problem if any of the separate layers are changed around.
This invariably will have an impact on the software development, since the DAL/BLL/UI will now be separate assemblies (probably separately compiled DLL's or equivalent) and truly separate tiers, rather than merely structuring the code into separate layers within one application/project.
I have, in the past, exposed the Business Layer of a web application as a web service, and the web GUI was entirely written against that service. This allowed the company to sell the product as a hosted web-based solution that clients could use whilst also selling access to the very same product as a web service, thereby allowing clients to integrate the product's functionality into their own internal applications (ala vertical market solution).
Of course, there's the balancing act. Separating the tiers onto separate machines will introduce some complexity into the overall architecture of the system. You correctly point to a couple of potential issues, such as the traffic between the machines which will now add some level of overhead that would not be there if the communicating tiers were on the same machine. There's also the marshalling of data between each tier which also adds overhead. Certainly in the case of a web-service, serializing and deserializing complex objects can add significant overhead and negatively impact performance, especially if there's very heavy traffic.
Depending upon what is actually exposed to the users of the overall application, security on the "lower" tiers may or may not required. If you're only exposing the web GUI, the lower tiers should be configured to be inaccessible (other than via the web server), however, if you are exposing the "business layer" as well as the web GUI layer, then you will have an additional burden of securing multiple potential attack "surfaces" of you application.
Ultimately, though, if you know you're not going to need to load balance the separate tiers, and you know you're not going to need to switch out one tier, or expose the business logic separately from the web UI, it may well be more effort than it's worth.