So all you need is simply 1 random post, 1 random post->ID or 1 post link, you dont need to go through all the hoops. (Update: added $wpdb function to tests)
Jump to conclusion or lets evaluate our options here:
query_posts(), get_posts(),wp_query(), $wpdb
As a rule of thumb, usually we can say wp_query > get_posts > query_posts, meaning; you should almost never ever use query_posts. And usually between the two, wp_query. performs better over get_posts in most situations. But, in our case, that’s not the case.
First, lets establish the fact that the end result is the same for all 3 methods; you’ll get 1 random post – object. I used the very same query args for all 3 methods:
		function eo_get_a_post_queryposts(){
			$args = array( 'posts_per_page' => 1, 'orderby' => 'rand' );
			$rand_post = query_posts( $args );
			return $rand_post;
		}
		function eo_get_a_post_getposts(){
			$args = array( 'posts_per_page' => 1, 'orderby' => 'rand' );
			$rand_post = get_posts( $args );
			return $rand_post;
		}
		function eo_get_a_post_wpquery(){
			$args = array( 'posts_per_page' => 1, 'orderby' => 'rand' );
			$rand_post_query_result = new WP_Query( $args );
			$rand_post = $rand_post_query_result->posts[0];
			return $rand_post;
		}
		function eo_get_a_post_wpdb() {
			global $wpdb;
			$rand_post = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'post' ORDER BY RAND() LIMIT 1");
			return $rand_post;
		}
And like I said the result you are gonna get is the same:
 
So, lets get down to the main point, the speed. Like you can imagine, query_postsget_posts:
 
The question was which was slightly better, get_posts or wp_query ? I thought wp_query would do better, like it usually does, since get_posts is essentially a wrapper for wp_query, but to my suprise, get_posts was faster:
 
I ran it 10,000 times to make sure – instead of 100. But the result wouldn’t change if you ran it for a mil. time: 
Update: I’ve added a $wpdb function to directly query the db, result is the same, get_posts is still faster.
Concluison: If all you need is 1 random post (object), simply use get_posts.
