Left joins will return rows if there are matching records or not (null) which is often useful. But in your case, it sounds like the events will always have matching records in the joined tables (will always have a city, etc.,) so you can do this.
Try **not** to use select *, be specific and select what you need. Let's say it's not a specific id, it's a printout of events within a specific date range . . .
$start_page = (isset($_GET['start']))?$_GET['start']:0; // EXAMPLE ONLY, cleanse that input . .
$per_page = 25; // for example
select TblEvent.EventID, TblEvent.name, TblEvent.start_datetime, TblEvent.end_datetime, TblArtist.name, TblArtist.whatever, TblVenues.address, TblVenues.city, TblVenues.state, TblVenues.country, TblVenues.description from TblEvent, TblArtist, TblVenues where TblEvent.ArtistID=TblArtist.ArtistID and TblEvent.VenueID=TblVenues.VenueID and TblEvent.start_datetime >= '2010-08-08 00:00:00' and TblEvent.end_datetime <= '2010-08-31 11:59:59' order by TblEvent.start_datetime asc, TblEvent.name.asc, TblArtist.name asc limit $start_page, $per_page;
May contain errors, typed on the fly, but that's the idea. As long as your joind table have a unique join id on the main query, this will (almost) always work. The limit would be of course dynamic based on pagination, and assuming the start and end dates are assumint datetime types. For specific entries, same thing, just change the date where parts to TblEvent.EventID=$event_id.
More efficient? Probably, it's one select. Heavier on your server? In large scale, maybe, maybe not, small scale (under 1 million records, not a heavily visited server) should be fine. Do benchmarking against both methods.