Here's the code that I extracted from
vim-startify; the key parts are creating a new buffer on the
VimEnter autocmd, putting some text in that, and then mapping the
i to start a new buffer and then go to insert mode.
I put the below in a little plugin which adds some settings and such, but the basic concept is exactly the same.
" Don't run if: we have commandline arguments, we don't have an empty
" buffer, if we've not invoked as vim or gvim, or if we'e start in insert mode
if argc() || line2byte('$') != -1 || v:progname !~? '^[-gmnq]\=vim\=x\=\%[\.exe]$' || &insertmode
" Start a new buffer ...
" ... and set some options for it
" Now we can just write to the buffer, whatever you want.
call append('$', "")
for line in split(system('fortune -a'), '\n')
call append('$', ' ' . l:line)
" No modifications to this buffer
setlocal nomodifiable nomodified
" When we go to insert mode start a new buffer, and start insert
nnoremap <buffer><silent> e :enew<CR>
nnoremap <buffer><silent> i :enew <bar> startinsert<CR>
nnoremap <buffer><silent> o :enew <bar> startinsert<CR>
" Run after "doing all the startup stuff"
autocmd VimEnter * call Start()