Append data to the_content within the database (not using filter)

I would say the best way to do this is using the save_post action, which is run every time a post is modified in edit screen. It will require a fair bit of fiddling when writing and reading post_content to/from the database. In the example below I add a list of post tags to post_content. A tricky but is the remove and readd the filter inside of its own callback, otherwise you’ll end up with a infinite loop.

add_action( 'save_post', 'my_save_post' );
function my_save_post( $post_id ) {
    $divider = "<!-- DIVIDER -->"; // We'll use this as a divider of actual post_content and our tag list

    //verify post is not a revision
    if ( !wp_is_post_revision( $post_id ) ) {

        // Remove filter to avoid infinite loop
        add_action( 'save_post', 'my_save_post' );

        $post = get_post($post_id);
        $content = $post->post_content;

        // Strip away old tags
        $editor_content = array_shift(explode($divider, $content));

        // Add new tag list to end of post_content
        $editor_content .= "\n" . $divider . "\n" .implode(", ", wp_get_post_terms($post_id, 'post_tag'));

        // Update post object and and database
        $post->post_content = $editor_content;
        wp_update_post($post);

        // Add filter again
        add_action( 'save_post', 'my_save_post' );
    }
}

You would probably also need to add a filter to remove the tag list form post_content before it’s being sent to the editor textarea. I think the_editor_content will do quite a good job in this case. What you want to do is basically the same thing as the first half of the above function, i.e. stripping away everything after the divider but with out appending a new tag list (we don’t want that showing up in the editor, right?). This means you can break that out into its own function and use that in both cases, but I’ll leave that to you.